 using UnityEngine;
using System.Collections;

public class MousePoint : MonoBehaviour {
	
	public struct ClipPlanePoints{
		
		public Vector3 UpperLeft;
		public Vector3 UpperRight;
		public Vector3 LowerLeft;
		public Vector3 LowerRight;
	}
	
  //Raycast para comprobar donde hace click
	RaycastHit hit;
	
   //Vector3 para guardar en que posicion hace click
	public Vector3 RightClickPoint;
   //Gameobject para almacenar la gema objetivo y poder manipularla
	public GameObject Target;
   //Sistema de particulas que sale al seleccionar una gema
	public ParticleSystem particleSys;
	
	//Transform (pos, rot, scale) del objetivo
	Transform target;
	public static Transform target0;
	
  //plataforma en la que corre la aplicacion
	private RuntimePlatform plataforma = Application.platform;
  //Ha hecho click ?
	private bool Click;
	
  //Variable para almacenar el script Gemas.cs y utilizar sus funciones
	public Gemas gemas;
	
  //que fila esta seleccionada ?
	public int selectorRow = -10;
  //que columna esta seleccionada
	public int selectorColumn = -10;
  //objeto gema seleccionada 
	private static Gema gemaSeleccionada;
  //objeto gema seleccionada anteriormente
	private static Gema prevGemaSeleccionada;
  //hay combinacion ?
	private bool Combinacion = false;
	
	void Start()
	{
		gemas = this.gameObject.GetComponent<Gemas>();	
		
		particleSys.enableEmission = false;
		
	}
	
	void Update()
	{		
		ClipPlanePoints nearPlanePoints = CameraClipPlanePoints(Camera.main.nearClipPlane);
		//Debug.Log(nearPlanePoints.LowerLeft + " , " + nearPlanePoints.LowerRight);
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		
				
		if (gemas.Clickeables == true)
		{		
			if(Physics.Raycast(ray, out hit, Mathf.Infinity))
			{
				
				Click = Input.GetMouseButtonDown(0);
					
				if (plataforma == RuntimePlatform.Android)
						Click = Input.touchCount == 1;
						
				if(Click && plataforma != RuntimePlatform.Android || 
					Click && plataforma == RuntimePlatform.Android &&
					Input.touches[0].phase == TouchPhase.Began)
				{  
           //si el raycast apunta a algun objeto en la capa (layer) 8       
					if (hit.collider.gameObject.layer == 8){
					
						Target = hit.collider.gameObject;					
						
						if (Target != null )
						{
							
							if (gemaSeleccionada != null)
							{	
								//gemaSeleccionada.CambiarColorBorde(Color.green);
								prevGemaSeleccionada = gemaSeleccionada;
								gemaSeleccionada = Target.transform.parent.gameObject.GetComponent<Gema>();
								
								
								if (!(((gemaSeleccionada.fila == prevGemaSeleccionada.fila + 1 || gemaSeleccionada.fila == prevGemaSeleccionada.fila - 1 )
									&& gemaSeleccionada.columna == prevGemaSeleccionada.columna) || ((gemaSeleccionada.columna == prevGemaSeleccionada.columna + 1 
									|| gemaSeleccionada.columna == prevGemaSeleccionada.columna - 1 ) && gemaSeleccionada.fila == prevGemaSeleccionada.fila))) {
									
									prevGemaSeleccionada.Seleccionada = false;
									gemaSeleccionada.Seleccionada = true;
									selectorRow = gemaSeleccionada.fila;
									selectorColumn = gemaSeleccionada.columna;
									particleSys.Clear();
									
									//Debug.Log("1) NO ESTAN CERCA | Sel: " + prevGemaSeleccionada.fila + "_" + prevGemaSeleccionada.columna + " -> Gem: " + gemaSeleccionada.fila + "_" + gemaSeleccionada.columna );
									
								}else{
									gemas.swapGems(prevGemaSeleccionada.fila, prevGemaSeleccionada.columna, gemaSeleccionada.fila, gemaSeleccionada.columna);
									// If they make a line...
									if (gemas.rowLineLength(prevGemaSeleccionada.columna, prevGemaSeleccionada.fila) > 2 || gemas.columnLineLength(prevGemaSeleccionada.columna, prevGemaSeleccionada.fila ) > 2 || 
										gemas.rowLineLength(gemaSeleccionada.columna, gemaSeleccionada.fila) > 2 || gemas.columnLineLength(gemaSeleccionada.columna, gemaSeleccionada.fila) > 2) {
										// remove the hint text										
										// dis-allow a new move until cascade has ended (removes glitches)
										gemas.Clickeables = false;
										// move and rename the gems
										Vector3 pos = prevGemaSeleccionada.gameObject.transform.GetChild(0).transform.position;
										Vector3 pos2 = gemaSeleccionada.gameObject.transform.GetChild(0).transform.position;
										prevGemaSeleccionada.gameObject.transform.GetChild(0).transform.rigidbody.MovePosition(pos2);
										prevGemaSeleccionada.gameObject.name = gemaSeleccionada.columna + "_" + gemaSeleccionada.fila;
										prevGemaSeleccionada.fila = gemaSeleccionada.fila;
										prevGemaSeleccionada.columna = gemaSeleccionada.columna;
										prevGemaSeleccionada.CambiarGravedad(true);
										prevGemaSeleccionada.Iniciada = false;
										gemaSeleccionada.gameObject.transform.GetChild(0).transform.rigidbody.MovePosition(pos);
										gemaSeleccionada.gameObject.name = selectorRow + "_" + selectorColumn;
										gemaSeleccionada.fila = selectorColumn;
										gemaSeleccionada.columna = selectorRow;
										gemaSeleccionada.CambiarGravedad(true);
										gemaSeleccionada.Iniciada = false;

										Combinacion = true;	
										Debug.Log("Hay combinacion");
										
										//Debug.Log("2) ESTAN CERCA Y HAY COMBINACION | Sel: " + selectorRow + "_" + selectorColumn + " -> Gem: " + prevGemaSeleccionada.fila + "_" + prevGemaSeleccionada.columna);
										//Debug.Log(" 1) RowLL: " + gemas.rowLineLength(prevGemaSeleccionada.fila, prevGemaSeleccionada.columna) + " || " + prevGemaSeleccionada.fila + "-" +  prevGemaSeleccionada.columna + 
										//	" 2) ColLL: " + gemas.columnLineLength(prevGemaSeleccionada.fila, prevGemaSeleccionada.columna) + 
										//	" 3) RowLL: " + gemas.rowLineLength(gemaSeleccionada.fila, gemaSeleccionada.columna) + " || " + gemaSeleccionada.fila + "-" + gemaSeleccionada.columna +
										//	" 4) ColLL: " + gemas.columnLineLength(gemaSeleccionada.fila, gemaSeleccionada.columna));
										
									}else{
										gemas.swapGems(prevGemaSeleccionada.fila, prevGemaSeleccionada.columna, gemaSeleccionada.fila, gemaSeleccionada.columna);
										Combinacion = false;
										gemaSeleccionada.Seleccionada = false;
										prevGemaSeleccionada.Seleccionada = false;
										particleSys.enableEmission = false;
										particleSys.Clear();
										
										//Debug.Log("3) ESTAN CERCA PERO NO HAY COMBINACION | Sel: " + prevGemaSeleccionada.fila + "_" + prevGemaSeleccionada.columna + " -> Gem: " + gemaSeleccionada.fila + "_" + gemaSeleccionada.columna);
										//Debug.Log(" || " + prevGemaSeleccionada.fila + "-" +  prevGemaSeleccionada.columna + " RowLL: " + gemas.rowLineLength(prevGemaSeleccionada.fila, prevGemaSeleccionada.columna) +  " ( " + gemas.rowLineLength(prevGemaSeleccionada.columna, prevGemaSeleccionada.fila) + " ) " +
										//	"\n 2) ColLL: " + gemas.columnLineLength(prevGemaSeleccionada.fila, prevGemaSeleccionada.columna) + " ( " + gemas.columnLineLength(prevGemaSeleccionada.columna, prevGemaSeleccionada.fila) + " ) " +
										//	"\n || " + gemaSeleccionada.fila + "-" +  gemaSeleccionada.columna + " RowLL: " + gemas.rowLineLength(gemaSeleccionada.fila, gemaSeleccionada.columna) + " ( " + gemas.rowLineLength(gemaSeleccionada.columna, gemaSeleccionada.fila) + " ) " +
										//	"\n 4) ColLL: " + gemas.columnLineLength(gemaSeleccionada.fila, gemaSeleccionada.columna) +  " ( " + gemas.columnLineLength(gemaSeleccionada.columna, gemaSeleccionada.fila) + " ) ");
									}
									
									if (Combinacion)
									{
										selectorRow = -10;
										selectorColumn = -10;	
										gemaSeleccionada.Seleccionada = false;
										prevGemaSeleccionada.Seleccionada = false;
										particleSys.enableEmission = false;
										particleSys.Clear();
										
										//Debug.Log("4) COMBINACION Sel: " + selectorRow + "_" + selectorColumn + " -> Gem: " + gemaSeleccionada.fila + "_" + gemaSeleccionada.columna);
										
									}else{										
										selectorRow = gemaSeleccionada.columna;
										selectorColumn = gemaSeleccionada.fila;
										Combinacion = false;
										gemaSeleccionada.Seleccionada = true;
										prevGemaSeleccionada.Seleccionada = false;
										prevGemaSeleccionada = gemaSeleccionada;
										particleSys.enableEmission = false;
										particleSys.Clear();
										
										
										//Debug.Log("5) NO HAY COMBINACION Sel: " + prevGemaSeleccionada.fila + "_" + prevGemaSeleccionada.columna + " -> Gem: " + gemaSeleccionada.fila + "_" + gemaSeleccionada.columna);
									}
								}
								
							}else{
								
								if (prevGemaSeleccionada)
									prevGemaSeleccionada.Seleccionada = false;								

								gemaSeleccionada = Target.transform.parent.gameObject.GetComponent<Gema>();
								gemaSeleccionada.Seleccionada = true;
								prevGemaSeleccionada = gemaSeleccionada;
								
								selectorRow = gemaSeleccionada.columna;
								selectorColumn = gemaSeleccionada.fila;
								
								//Debug.Log("6) Sel: " + selectorRow + "_" + selectorColumn + " -> Gem: " + gemaSeleccionada.fila + "_" + gemaSeleccionada.columna);
							}
							
							if (!gemaSeleccionada.Iniciada){
								gemaSeleccionada.Seleccionada = false;
								gemaSeleccionada = null;
								
								//Debug.Log("7");
							}
							
							if (gemaSeleccionada){				
								particleSys.Clear();
								particleSys.enableEmission = true;
								particleSys.transform.position = new Vector3(Target.transform.position.x, Target.transform.position.y, Target.transform.position.z - 0.05f);
								particleSys.startColor = ColorGema(gemaSeleccionada.Tipo);
								particleSys.transform.GetChild(0).GetComponent<ParticleSystem>().startColor = ColorGema(gemaSeleccionada.Tipo);
								
								//Debug.Log("8");
							}
						}
					}
				}	
			}
		}	
		if (Application.isEditor)
			Debug.DrawRay(ray.origin, ray.direction * Mathf.Infinity, Color.yellow);
	}
	
  //Interfaz grafica (botones, componentes para menu, etc.)
	public void OnGUI(){
		
		if (GUI.Button(new Rect((Screen.width / 2) + 40, Screen.height - 45, 100, 40), "Salir")){
			
		Application.Quit();	
			
		}
		
		if (GUI.Button(new Rect((Screen.width / 2) - 110, Screen.height - 45, 100, 40), "Reiniciar")){
			
			Camera.main.GetComponent<Gemas>().CrearGemas();
			particleSys.enableEmission = false;
			particleSys.Clear();
			gemas.score = 0;			
		}
		
		GUI.Label(new Rect((Screen.width / 2), 20, 100, 40), "Puntuacion: " + gemas.score);
		
	}
	
  //devolver un color segun el tipo de gema, para aplicarlo al sistema de particulas
	private Color ColorGema(Gema.TipoGema tipoGema){
		
		switch(tipoGema)
		{
		case Gema.TipoGema.Ninguno:			
			return Color.white;
		case Gema.TipoGema.Verde:
			return new Color(0.7647058823529412f, 0.9882352941176471f, 0f, 0.5f);
		case Gema.TipoGema.Naranja:			
			return new Color(0.9882352941176471f, 0.4117647058823529f, 0.2509803921568627f, 0.5f);			
		case Gema.TipoGema.Amarilla:
			return new Color(0.996078431372549f, 0.8431372549019608f, 0.0196078431372549f, 0.5f);
		case Gema.TipoGema.Lila:
			return new Color(0.796078431372549f, 0f, 0.9882352941176471f, 0.5f);
		case Gema.TipoGema.Azul:
			return new Color(0f, 0.3803921568627451f, 0.9882352941176471f, 0.5f);
		case Gema.TipoGema.AzulClaro:
			return new Color(0.396078431372549f, 1f, 1f, 0.5f);
		case Gema.TipoGema.Rojo:
			return new Color(0.9882352941176471f, 0, 0.2509803921568627f, 0.5f);
		case Gema.TipoGema.Gris:
			return new Color(0.7450980392156863f, 0.7137254901960784f, 0.7137254901960784f, 0.5f);
		default:
			return Color.white;
		}
	
		
	}
	
  //sin usar de momento
	public ClipPlanePoints CameraClipPlanePoints(float Distance){
		
		ClipPlanePoints clipPlanePoints = new ClipPlanePoints();
		
		Transform transform = Camera.main.transform;
		Vector3 pos = transform.position;
		float halfPOV = (Camera.main.fieldOfView * 0.5f) * Mathf.Deg2Rad;
		float aspect = Camera.main.aspect;
		
		float height = Mathf.Tan(halfPOV) * Distance;
		float width = height * aspect;
		
		clipPlanePoints.LowerRight = pos + transform.forward * Distance;
		clipPlanePoints.LowerRight += transform.right * width;
		clipPlanePoints.LowerRight -= transform.up * height;
		
		clipPlanePoints.LowerLeft = pos + transform.forward * Distance;
		clipPlanePoints.LowerLeft -= transform.right * width;
		clipPlanePoints.LowerLeft -= transform.up * height;
		
		clipPlanePoints.UpperRight = pos + transform.forward * Distance;
		clipPlanePoints.UpperRight += transform.right * width;
		clipPlanePoints.UpperRight += transform.up * height;
		
		clipPlanePoints.UpperLeft = pos + transform.forward * Distance;
		clipPlanePoints.UpperLeft -= transform.right * width;
		clipPlanePoints.UpperLeft += transform.up * height;		
		
		return clipPlanePoints;		
	}
	
}
